#pragma once

#include <stdint.h>
#include <thread>
#include <memory>

namespace Common
{

#if defined(_WIN32) || defined(_WIN64)
#define Common_DllExport __declspec(dllexport)
#else
#define Common_DllExport
#endif  // _WIN32

/***************************************************************
 * 功能：定时时间到了后的处理函数，由调用者实现
 * *************************************************************/
typedef void (*pfnOnTimer)(void);

// 定时器属性
struct TimerAttributes
{
    bool bLoop = true; // 是否循环定时触发任务
    int iIntervalMs = 0;// 定时间隔，单位毫秒（ms）
    pfnOnTimer pfn = nullptr; // 定时任务

    TimerAttributes()
    {

    }

    TimerAttributes(bool loop, int intervalms, pfnOnTimer func)
    {
        bLoop = loop;
        iIntervalMs = intervalms;
        pfn = func;
    }
};


// 注意：当前该定时器只支持维护一个定时任务，后期须修改为支持多个定时任务
class Common_DllExport Timer
{
public:
    /***************************************************************
     * 功能：构造函数
     * *************************************************************/
    Timer();

    /***************************************************************
     * 功能：析构函数
     * *************************************************************/
    ~Timer();

    /***************************************************************
     * 功能：开始定时器
     * 输入参数：
     *      stAttr：定时器属性
     * 返回值：
     *      int：定时器的id，停止定时器时会用到
     * *************************************************************/
    int startTimer(const TimerAttributes& stAttr);

    /***************************************************************
     * 功能：停止定时器
     * 输入参数：
     *      id：定时器的id
     * *************************************************************/
    void stopTimer(int iId);

    /***************************************************************
     * 功能：获取定时器的id
     * 返回值：
     *      int：定时器的id
     * *************************************************************/
    int getTimerID();

    /***************************************************************
     * 功能：响应处理具体的定时任务
     * 输入参赛：
     *      iId：定时器的id
     * *************************************************************/
    void onTimeEvent(int iId);

private:
    bool m_bRunning = false; // 运行标识
    int m_iId = -1; // 定时器id
    std::shared_ptr<std::thread> m_spth4TimerTask; // 定时任务的线程智能指针
    TimerAttributes m_stAttr; // 属性
};


} // namespace Common
